/*封装常用的事件包括 ajax*/
$.extend({
    HTTP: {
        /*
         * 基础ajax封装
         */
        Request: function(_url, _data, sufu, opts) {
            //ajax 请求
            var token = ""; //$.cookie("o_autn_token");
            if (token === undefined || token == null || token == "") {
                token = "";
            }
            if (sufu === undefined) {
                sufu = {};
            }
            _url = "http://192.168.1.101/" + _url;
            var o = $.extend({
                url: _url,
                type: "post",
                headers: { "O-Auth-Token": token },
                contentType: "application/json",
                data: JSON.stringify(_data),
                dataType: "json",
                success: function(data) {
                    if ($.isHttpResult(data)) {
                        sufu(true, data);
                        return;
                    }
                    //过期 重新登录 跳转登录页面
                    if (data.Errcode == 40002 || data.Errcode == 40000) {
                        top.window.location.href = "/login.html";
                        return;
                    }
                    //无权访问该页面
                    if (data.Errcode == 4030) {
                        window.location.href = "";
                        return;
                    }
                    sufu(false, data);
                }
            }, opts);
            $.ajax(o);
        },
        /*
         * POST请求
         * url 请求地址
         * data 数据
         * sufu 成功回调{pass:function(){},error:function:(){}}
         * opts.msg 请求前会自动 出现一个加载框
         * opts.jquery 参考jquery ajax参数设置
         */
        POST: function(url, data, sufu, opts) {
            var _layerIndex = 0;

            opts = Object.assign({
                laod: true,
                laodMsg: "加载中..."
            }, opts);

            if (opts === undefined) { opts = {} };
            if (!opts.hasOwnProperty("msg")) {
                opts.msg = "提交中...";
            }
            //如果不关闭
            if (opts.laod) {
                opts.jquery.beforeSend = function() {
                    _layerIndex = layer.msg(opts.laodMsg, { icon: 16, shade: 0.3, time: 0 });
                }
            } else {
                //自动关闭 让jquery事件去做
                opts.jquery = Object.assign(opts.jquery, {
                    complete: function() {
                        layer.close(_layerIndex);
                    }
                });
            }
            this.HTTP.Request(url, data, sufu, opts.jquery);
        },

        /*
         * GET 请求
         * url 请求地址
         * data 数据
         * sufu 成功回调{pass:function(){},error:function:(){}}
         * opts.msg 请求前会自动 出现一个加载框
         * opts.jquery 参考jquery ajax参数设置
         */
        GET: function(url, data, sufu, opts) {
            this.HTTP.POST(url, data, sufu, Object.assign({ jquery: { type: "get" } }, opts));
        }

    },
    /*
     * 计算页码分析
     */
    CalculatePage: function(pageCount, pageSize) {
        return parseInt((pageCount % pageSize) == 0 ? pageCount / pageSize : pageCount / pageSize + 1);
    },
    /*
     * 判断 http请求结果
     */
    isHttpResult: function(o) {
        if (o == null || o == "") { return true; }
        if (o.hasOwnProperty("Errcode")) {
            if (o.Errcode > 0 || o.Errcode < 0) {
                return false;
            }
            return true;
        }
        return true;
    }
})

/*模板渲染 依赖template-web.js*/
$.fn.showHtml = function(data, id) {
    if (id === undefined) { id = "tp_app"; }
    var renderHtml = template(id, data);
    this.html(renderHtml);
}


/*
 * 弹窗
 * 依赖layer.js
 */
$.extend({
    layer: {
        /*
         * alter方法
         */
        alert: function(a, b, d) {
            return layer.alert(a, b, d);
        },
        /*
         * 返回索引
         */
        confirm: function(c, opts) {
            if (typeof(opts) == "function") {
                return layer.confirm(c, { icon: 3, shade: [0.16, '#000'], yes: opts });
            }
            opts = $.extend({ icon: 3, shade: [0.16, '#000'] }, opts);
            return layer.confirm(c, opts);
        },
        /**
         * 正确或者错误
         * @param {检查是否通过} check 
         * @param {*} content 
         * @param {*} opts 
         */
        msgSuccessOrError: function(check, content, opts) {
            if (check) {
                return this.msgSuccess(content, opts);
            }
            return this.msgError(content, opts);
        },
        /*
         * 成功提示信息
         *  c:内容
         *  e:回调函数
         *  o:自定义参数
         */
        msgSuccess: function(c, o) {
            o = $.extend({ offset: '2px', shift: 7, icon: 1, time: 3000 }, o);
            return layer.msg(c, o);
        },
        /*
         * 失败提示
         */
        msgError: function(c, o) {
            o = $.extend({ offset: '2px', shift: 6, icon: 2, time: 3000 }, o);
            return layer.msg(c, o);
        },
        /*
         * 预加载
         */
        loading: function(c, opts) {
            if (undefined === c) { c = "正在加载..."; }
            return layer.msg(c, { icon: 16, shade: [0.16, '#000'], time: 0 }, opts);
        },

        /*
         * 弹出ifram
         * src 路径 必填
         * title 标题 
         * wh 高跟宽 数组
         */
        iframe: function(src, title, wh, opts) {
            if (title === undefined) { title: false; }
            if (wh === undefined) { wh = [($(window).width() - 30) + 'px', ($(window).height() - 30) + 'px'] }
            if (opts === undefined) {
                opts = Object.assign({}, {
                    type: 2,
                    title: title,
                    shadeClose: false,
                    maxmin: true,
                    area: wh,
                    shade: [0.16, '#000'],
                    content: src
                }, opts);
            }
            return layer.open(opts);
        },
        /*
         * 页面层
         */
        page: function(opts) {
            return layer.open(Object.assign({
                type: 1,
                area: ['420px', '240px'] //宽高
            }, opts));
        },
        /*
         * 关闭弹窗的事件
         */
        close: function(index) {
            return layer.close(index);
        },
        //关闭所有
        closeAll: function() {
            layer.closeAll();
        }
    }
})


/*
 * 基于form提交继承的获取数据
 * opts 类型 {}
 * opts.checkboxOutType 多选输出类型
 * opts.addData 合并参数
 * opts.overrideData 重写数据 会返回一个源数据
 */
$.fn.getFormData = function(opts) {
    /*
     * 获取对应的表单值
     */
    function getFormValues(obj, type) {
        if (type == "" || type == null || type === undefined) { return $(obj).val(); }
        if (type == "val") { return $(obj).val(); }
        if (type == "text") { return $(obj).text(); }
        if (type == "html") { return $(obj).html(); }
        return $(obj).attr(type);
    }

    function _getFormJson(obj) {
        var _json = {};
        $(obj).find("*[data-form]").each(function(i, dom) {
            var ot = $(dom).attr("data-form");
            var keyName = ot.split("&")[0];
            var valType = ot.split("&")[1];
            if ($(dom).prop("tagName").toLocaleLowerCase() == "input") {
                var dom_type = $(dom).attr("type");
                if (dom_type == "radio") {
                    _json[keyName] = $("input[data-form='" + keyName + "']:checked").val();
                } else if (dom_type == "checkbox") {
                    var ckarr = $("input[data-form='" + keyName + "']:checked").map(function() { return $(this).val(); }).get();
                    if (typeof(opts.checkboxOutType) == "string") {
                        _json[keyName] = ckarr.join(opts.checkboxOutType);
                    } else {
                        _json[keyName] = ckarr;
                    }
                } else {
                    _json[keyName] = getFormValues(this, valType);
                }
            } else {
                _json[keyName] = getFormValues(this, valType);
            }
        });
        return _json;
    }
    var _vjson = {};
    if (opts === undefined) { opts = {}; }
    //默认多选为数组
    if (!opts.hasOwnProperty("checkboxOutType"))
        opts.checkboxOutType = ",";
    if (this.length > 1) {
        this.each(function(top_i, top_dom) {
            var top_key = $(top_dom).attr("data-form-key");
            _vjson[top_key] = _getFormJson(top_dom);
        })
    } else {
        _vjson = _getFormJson(this);
    }
    if (_vjson.leng <= 0) { return; }
    _vjson = $.extend(_vjson, opts.addData);
    if (opts.hasOwnProperty("overrideData")) {
        return opts.overrideData(_vjson);
    }
    return _vjson;
}


/*
 * 表单提交
 * data-form="key&type" => key&type(键&指定类型[val(可为空)/text/html])
 * url ：ajax提交后台的地址
 * successFun 成功回调函数
 * opts:可选参数
 *  opts.jquery 为jquery库正规参数
 *  opts.addData 合并这个数据
 * 	opts.onEditData 编辑数据源 必须返回
 *  opts.checkboxOutType 可指定选中的多选输出格式,[]=数组输出 ","=,分割 可以是任意字符串 默认,分割
 *  opts.valid 是否开启验证，默认开始
 */
$.fn.ajaxFormSubmit = function(url, successFun, opts) {
    /*
     * 获取对应的表单值
     */
    function getFormValues(obj, type) {
        if (type == "" || type == null || type === undefined) {
            return $(obj).val();
        }
        if (type == "val") {
            return $(obj).val();
        }
        if (type == "text") {
            return $(obj).text();
        }
        if (type == "html") {
            return $(obj).html();
        }
        if ($(obj).prop("tagName").toLocaleLowerCase() == "select") {
            return $(obj).children("option:selected").attr(type);
        }
        return $(obj).attr(type);
    }

    function _getFormJson(obj) {
        var _json = {};
        $(obj).find("*[data-form]").each(function(i, dom) {
            var ot = $(dom).attr("data-form");
            var keyName = ot.split("&")[0];
            var valType = ot.split("&")[1];
            if ($(dom).prop("tagName").toLocaleLowerCase() == "input") {
                var dom_type = $(dom).attr("type");
                if (dom_type == "radio") {
                    _json[keyName] = $("input[data-form='" + keyName + "']:checked").val();
                } else if (dom_type == "checkbox") {
                    var ckarr = $("input[data-form='" + keyName + "']:checked").map(function() {
                        return $(this).val();
                    }).get();
                    if (typeof(opts.checkboxOutType) == "string") {
                        _json[keyName] = ckarr.join(opts.checkboxOutType);
                    } else {
                        _json[keyName] = ckarr;
                    }
                } else {
                    _json[keyName] = getFormValues(this, valType);
                }
            } else {
                _json[keyName] = getFormValues(this, valType);
            }
        });
        return _json;
    }
    var vjson = {};
    opts = Object.assign({ checkboxOutType: ",", valid: true, on: { checkFall: function() {} } }, opts);
    if (this.length > 1) {
        this.each(function(top_i, top_dom) {
            var top_key = $(top_dom).attr("data-form-key");
            vjson[top_key] = _getFormJson(top_dom);
        })
    } else {
        vjson = _getFormJson(this);
    }
    if (vjson.leng <= 0) {
        return;
    }
    vjson = Object.assign(vjson, opts.addData);
    var postData = opts.hasOwnProperty("onEditData") == false ? vjson : opts.onEditData(vjson);

    var _Opts = Object.assign({
        loadMsg: "请稍等..."
    }, opts);
    //验证
    if (opts.valid) {
        if (this.formValid().check() == false) {
            opts.on.checkFall(false);
            return;
        }
    }

    $.HTTP.POST(url, postData, successFun, _Opts);
};

/*
 * 获取一组 多选的值
 * at 默认获取value 否则获取 attr属性
 * type 默认,分割 否则自定义分割
 */
$.fn.getCheckedData = function(opts) {
    if (opts === undefined || opts == null) { opts = { at: "", type: "," } };
    if (typeof(opts.type) === "object") {
        return this.map(function() {
            return opts.at == "" ? $(this).val() : $(this).attr(opts.at);
        }).get();
    }
    return this.map(function() {
        return opts.at == "" ? $(this).val() : $(this).attr(opts.at);
    }).get().join(opts.type);
}

/*
 * 扩展 类似于CS里面的占位方法
 */
String.prototype.Format = function() {
    if (arguments.length == 0) return this;
    for (var s = this, i = 0; i < arguments.length; i++)
        s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i] == null ? "" : arguments[i]);
    return s;
};

/*
 * 格式化时间 JS JSON格式
 * 参数 格式化类型
 * 依赖 moment.js
 */
Date.prototype.Dateformat = function(o) {
        if (o === undefined) { o = 'YYYY年MM月DD日 HH:mm:ss a' }
        return moment(this.slice()).format(o);
    }
    /*
     * 格式化时间 JS JSON格式
     * 参数 格式化类型
     * 依赖 moment.js
     */
String.prototype.Dateformat = function(o) {
    if (o === undefined) { o = 'YYYY年MM月DD日 HH:mm:ss a' }
    return moment(this.slice()).format(o);
}

//升序
Array.prototype.sortAsce = function(key) {
        return this.sort(function(a, b) { return (a[key] > b[key]) ? 1 : -1 })
    }
    //降序
Array.prototype.sortAsc = function(key) {
        return this.sort(function(a, b) { return (a[key] < b[key]) ? 1 : -1 })
    }
    /**
     * 获取url参数
     * @param name
     */
String.prototype.URL_Query = function(name) {
        var reg = new RegExp("(^|&|\\?)" + name + "=([^&]*)(&|$)", "i");
        var r;
        try {
            r = unescape(this.slice().match(reg)[2]);
        } catch (e) {
            r = null;
        }
        if (r != null) return unescape(r);
        return null;
    }
    /**
     * 获取当前路径的参数
     * @param name
     */
function Url_Query(name) {
    return window.location.href.URL_Query(name);
}





/**
 *  列表常用的分页工具
 */

$.fn.ajaxPageTable = function(url, params, opts) {
    var $t = this;

    var _defaultOpts = {
        load: {
            el: "#table_load",
            title: "加载中...",
        },
        empty: "找不到对应的数据",
        error: null,
        tpEl: "table_tp",
        pageEl: "#table_page",
        success: function() {}
    };

    opts = Object.assign(_defaultOpts, opts);
    params = Object.assign({ Page: { Index: 1, Size: 10, Num: 8 } }, params);
    if (!opts.hasOwnProperty("beforeSend")) {
        opts.beforeSend = function() {
            $(opts.load.el).addClass("load-indicator loading");
        };
    }
    $.HTTP.Request(url, params, function(errorState, d) {
        $(opts.load.el).removeClass("load-indicator loading");
        if (!errorState) {
            return;
        }
        var data = { datas: d.Data };
        $t.showHtml(data, opts.tpEl);

        var $tbody = $t.children("tbody");
        var trLength = $tbody.children("tr").length;
        console.log(trLength);
        if (trLength <= 0) {
            var thLength = $t.children("thead").children("tr").children("th").length;
            var emptyHtml = '<td colspan="' + thLength + '">' +
                '<div class="table-data-empty"><i class="icon icon-meh"></i><span>' + opts.empty + '</span></div>' +
                '</td>';
            $tbody.html(emptyHtml);
        }
        opts.success(d.Data);
        $(opts.pageEl).pager({
            page: params.Index,
            recTotal: d.DataCount,
            recPerPage: d.PageSize,
            maxNavCount: params.Page.Num,
            menuDirection: "dropup",
            pageSizeOptions: [10, 20, 30, 50, 100],
            elements: ['size_menu', 'page_of_total_text', 'total_text', 'first_icon', 'prev_icon', 'pages', 'next_icon', 'last_icon', 'goto'],
            lang: 'zh_cn',
            linkCreator: function(page, pager) {},
            onPageChange: function(state) {
                params.Page.Index = state.page;
                params.Page.Size = state.recPerPage;
                $t.ajaxPageTable(url, params, opts);
            }
        });

    }, {
        beforeSend: opts.beforeSend,
        error: opts.error,
        complete: function(XMLHttpRequest, textStatus) {
            XMLHttpRequest = null;
        }
    });
}

/*
 * 分页数据版本 不进行任何加载操作返回源数据
 */
$.fn.ajaxPageListData = function(url, success, params, opts) {
    var $t = this;
    var _defaultOpts = { pageEl: "#list-page" };
    params = $.extend({ Page: { Index: 1, Size: 10, Num: 5 } }, params);
    opts = $.extend(_defaultOpts, opts);
    $.http.json(url, params, {
        pass: function(d) {
            success(d.Data);
            $(opts.pageEl).controlPager({
                pageCount: d.DataCount,
                pageNow: d.PageIndex,
                pageSize: d.PageSize,
                pageNum: params.Num,
                onPage: function(a) {
                    params.Page.Index = a;
                    $($t).ajaxPageListData(url, success, params, opts);
                },
                onSearch: function(a) {
                    params.Page.Index = a;
                    $($t).ajaxPageListData(url, success, params, opts);
                }
            });
        }
    }, {
        jquery: {
            error: opts.error,
            complete: function(XMLHttpRequest, textStatus) {
                XMLHttpRequest = null;
            }
        }
    });
}

/*
 * 滚动刷新 
 * url:请求地址
 * sufu:成功回调
 * params 请求参数
 *   默认: pIndex =1
 * sufu:成功回调函数
 * opts:可扩展的参数 
 *   opts.jquery = JQuery ajax 原生态的参数 
 *   opts.tdistance 离下一次滚动多少高度触发(单位/px) 默认20
 *   opts.tip 各种滚动情况下的提示信息
 *   opts.tip.start 开始准备滚动加载 默认:正在加载中...
 *   opts.tip.null 没有数据情况下的提示 默认:已经没有更多数据了
 *   opts.tip.roll 滚动中的提示 默认:滚动加载数据
 */
$.fn.ajaxScrollPage = function(url, sufu, params, opts) {
        var _this = this;
        var _loadState = false;
        var _LoadSelect;
        var _defaultOpts = {
            jQuery: { dataType: "json" },
            load: {
                el: $(".ajax-scroll-page"),
                tip: {
                    start: {
                        icon: '<i class="fa fa-spinner fa-spin"></i>&nbsp;',
                        text: '正在加载中...'
                    },
                    roll: {
                        icon: '<i class="fa fa-spinner fa-spin"></i>&nbsp;',
                        text: '滚动加载数据'
                    },
                    dataNull: {
                        icon: '<i class="fa fa-check-circle"></i>&nbsp;',
                        text: '已经没有更多数据了'
                    }
                }
            }
        };
        var _Data = $.extend({ Page: { Index: 1, Size: 10, Num: 5 } }, params);
        opts = $.extend(_defaultOpts, opts);
        if (opts.load.hasOwnProperty("el")) {
            _LoadSelect = $(opts.load.el);
        }
        opts.jQuery.beforeSend = function() {
            _loadState = false;
            _LoadSelect.show().html(opts.load.tip.start.icon + opts.load.tip.start.text);
        };
        if (!opts.hasOwnProperty("tdistance")) {
            opts.tdistance = 20;
        }

        function _Ajax() {
            $.http.request(url, _Data, function(d) {
                if (d.Data == null || d.Data.length <= 0) {
                    _LoadSelect.html(opts.load.tip.dataNull.icon + opts.load.tip.dataNull.text);
                    return;
                }
                if (_Data.Page.Index > $.CalculatePage(d.DataCount, d.PageSize)) {
                    _LoadSelect.html(opts.load.tip.dataNull.icon + opts.load.tip.dataNull.text);
                    return;
                };
                _LoadSelect.show().html(opts.load.tip.roll.icon + opts.load.tip.roll.text);
                sufu(d);
                if (d.Data.length <= d.PageSize && $.CalculatePage(d.DataCount, d.PageSize) <= 1) {
                    _LoadSelect.html(opts.load.tip.dataNull.icon + opts.load.tip.dataNull.text);
                    return;
                }
                _loadState = true;
            }, opts.jQuery);
        }
        _Ajax();
        _this.unbind("scroll").bind("scroll", function() {
            if ((opts.tdistance + _this.scrollTop()) >= ($(document.body).height() - _this.height())) {
                if (!_loadState) { return; }
                _Data.Page.Index++;
                _Ajax();
            }
        })
    }
    /*
     * 获取当前table中选中的多选按钮
     * opts 可以选 
         默认选中 data-id 属性值
         返回格式 v,v,v 字符串
         设置 object类型 将返回 数组
     */

$.fn.getTableChecked = function(opts) {
    opts = $.extend({ at: "", type: "," }, opts);
    if (typeof(opts.type) === "object") {
        return this.find("input[type='checkbox'][data-checked-table='single']:checked")
            .map(function() {
                return opts.at == "" ? $(this).val() : $(this).attr(opts.at);
            }).get();
    }
    return this.find("input[type='checkbox'][data-checked-table='single']:checked")
        .map(function() {
            return opts.at == "" ? $(this).val() : $(this).attr(opts.at);
        }).get().join(opts.type);
}